// eventBus: 包含所有功能的事件总线对象
// eventBus.on(eventName, listener): 绑定事件监听
// eventBus.emit(eventName, data): 分发事件
// eventBus.off(eventName): 解绑指定事件名的事件监听, 如果没有指定解绑所有

export const eventBus = {
  // 保存类型与回调的容器
  callbacks: {

  }
}

/**
 * * 绑定事件
 * 其实就是将对应的事件名以及回调保存到 eventBus 的 callbacks 对象中
 * @param {*} type 事件类型
 * @param {*} callback 回调函数
 */
eventBus.on = function(type, callback) {
  // 获取 eventBus 中 callbacks 对象的 type 属性
  const callbacks = this.callbacks[type] 
  // 判断
  if (callbacks) {
    // 如果 callbacks 属性中存在该类型事件
    callbacks.push(callback)
  } else {
    // 如果 callbacks 属性中不存在该类型事件
    this.callbacks[type] = [callback]
  }
}

/**
 * * 事件触发
 * @param {*} type 事件类型
 * @param {*} data 数据
 */
eventBus.emit = function(type, data) {
  const callbacks = this.callbacks[type] 
  // 判断 如果 callbacks 属性中存在该类型事件和该数组长度大于0
  if (callbacks && callbacks.length > 0) {
    // 遍历数据
    callbacks.forEach(callback => {
      // 执行回调
      callback(data)
    })
  }
}

/**
 * * 事件解绑
 * @param {*} eventName 事件名
 */
eventBus.off = function(eventName) {
  // 若传入了 eventName 事件类型
  if (eventName) {
    // 只删除 eventName 对应的事件回调
    delete this.callbacks[eventName]
  } else {
    // 否则，全部清空
    this.callbacks = {}
  }
}

